package chaoyue.study.lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 可重入锁
 * 默认是使用的非公平锁，因为性能比较高
 * 公平锁：在竞争锁资源时先判断队列里有没有在等待的线程，如果有则入队等待
 * 非公平锁：不管队列里有没有线程在等待，都尝试去抢占锁资源（避免频繁切换内核态和用户态）
 * 解锁时候二者唤醒都是从队首开始唤醒的
 */
public class ReentrantLockTest {
    private static final Lock lock = new ReentrantLock();
    private volatile static int COUNT = 0;

    public static void main(String[] args) throws InterruptedException {
        Runnable r = () -> {
            for (int i = 0; i < 100000; i++) {
                lock.lock(); // 加锁
                COUNT++;
                lock.unlock(); //解锁 unlock一般都放在finally中
            }
        };

        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);

        t1.start();
        t2.start();
        t1.join();
        t2.join();

        System.out.println("COUNT: " + COUNT);
    }
}
